//
//  WBStatusViewModel.swift
//  Weibo
//
//  Created by cc on 10/18/17.
//  Copyright © 2017 cc. All rights reserved.
//

import Foundation


/// 单条微博的视图模型
/*
     如果没有任何父类，如果希望在开发时调试，输出调试信息，需要
     1. 遵守 CustomStringConvertible
     2. 实现 description 计算型属性
 
     关于表格的性能优化
     - 尽量少计算，所有需要的素材提前计算好
     - 控件上不要设置圆角半径，图像的渲染属性，都要注意
     - 不要动态创建控件，所有需要的控件都要提前创建好，在显示的时候，根据数据隐藏或显示
     - cell中的控件层次赿少越好
 
 */
class WBStatusViewModel: CustomStringConvertible {
    var status: WBStatus
    
    /// 会员图标 - 存储型属性(用内存换cpu)
    var memberIcon: UIImage?
    
    /// 认证类型， -1 没认证， 0 认证， 2，3，5:企业认证，220:达人
    var vipIcon: UIImage?
    
    /// 转发文字
    var retweetedStr: String?
    
    ///评论文字
    var commentStr: String?
    
    ///点赞文字
    var likeStr: String?
    
    /// 配圖視圖大小
    var pictureViewSize = CGSize()
    
    
    ///如果是被轉發的微博，原創微博一定沒有圖
    var picUrls: [WBStatusPicture]? {
        //如果有被轉發的微博，返回被轉發微博的配圖
        //如果沒有被轉發的微博，返回原創微博的配圖
        //如果都沒有，返回nil
        return status.retweeted_status?.pic_urls ?? status.pic_urls

    }
    
    /// 微博正文的属性文本
    var statusAttrText: NSAttributedString?
    
    /// 被轉發微博的属性文本
    var retweetedAttrText: NSAttributedString?
    
    /// 行高
    var rowHeight: CGFloat = 0
    
    
    /// 构造函数
    ///
    /// - Parameter model: 微博模型
    init(model: WBStatus) {
        self.status = model
        
        //直接计算出会员图标，会员等级 0-6
        if (model.user?.mbrank)! > 0 && (model.user?.mbrank)! < 7{
            let imageName = "common_icon_membership_level\(model.user?.mbrank ?? 1)"
            memberIcon = UIImage(named: imageName)
        }
        
        //认证图标
        switch model.user?.verified_type ?? -1 {
        case 0:
            vipIcon = UIImage(named: "avatar_vip")
        case 2,3,5:
            vipIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            vipIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }
        
        //设置底部计数字符串
//        model.reposts_count = Int(arc4random_uniform(100000)) // test
        retweetedStr = countString(count: model.reposts_count, defaultStr: "转发")
        commentStr = countString(count: model.comments_count, defaultStr: "评论")
        likeStr = countString(count: model.attitudes_count, defaultStr: "赞")
        
        //計算配圖視圖大小(有原創的計算原創的，有轉發的就計算轉發的)
        pictureViewSize = calcPictureViewSize(count: picUrls?.count)
        
        
        
        //设置微博文本
        let originalFont = UIFont.systemFont(ofSize: 15)
        let retweetedFont = UIFont.systemFont(ofSize: 14)
        
        //微博正文的属性文本
        statusAttrText = CZEmoticonManager.shared.emoticonString(string: model.text ?? "", font: originalFont)
        
        //設置被轉發微博的属性文字
        //爲了解決報錯 : Expression was too complex to be solved in reasonable time; consider breaking up the expression into 設置了 tmpRetweetedText1 和 tmpRetweetedText2
        let tmpRetweetedText1 = "@" + (status.retweeted_status?.user?.screen_name ?? "")
        let tmpRetweetedText2 = ":" + (status.retweeted_status?.text ?? "")
        let rText = tmpRetweetedText1 + tmpRetweetedText2
        retweetedAttrText = CZEmoticonManager.shared.emoticonString(string: rText, font: retweetedFont)
        
        //計算行高
        updateRowHeight()
    }

    var description: String {
        return status.description
    }
    
    
    /// 根據當前的視圖模型內容計算行高
    func updateRowHeight() {
        
        //原創微博： 頂部分隔視圖12 +　間距12 + 圖像高度34 + 間距12 + 正文高度 (待計算) + 配圖視圖高度（待計算） + 間隔12 + 底部視圖高度35
        //被轉發微博：頂部分隔視圖12 +　間距12 + 圖像高度34 + 間距12 + 正文高度 (待計算)+ 間距12 + 間距12 +轉發文本高度（待計算) + 配圖視圖高度（待計算） + 間隔12 + 底部視圖高度35
        
        let margin: CGFloat = 12
        let iconHeight: CGFloat = 34
        let toolBarHeight: CGFloat = 35
        
        var height: CGFloat = 0
        
        let viewSize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat(MAXFLOAT))
        
        
        //1.計算頂部高度
        height = 2 * margin + iconHeight + margin
        
        //2.正文属性文本的高度
      
        if let text = statusAttrText {
            height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height

        }
        
        //3.判斷是否轉發微博
        if status.retweeted_status != nil {
            height +=  2 * margin
            
            //轉發文本的高度  - 一定用 retweetedText， 拼接了 @用戶名:微博文字
            if let text = retweetedAttrText {
                height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
                
                
            }
        }
        
        //4.配圖視圖
        height += pictureViewSize.height
        height += margin
        
        
        //5.底部工具欄
        height += toolBarHeight
        
        rowHeight = height
    }
    
    
    
    /// 使用單個圖像，更新配圖視圖的大小
    ///
    ///  新浪微博針對單張圖片，都是縮略圖。但是偶爾會有一張很大的圖
    ///  新浪 支持 長微博
    /// - Parameter image: 網絡緩存的單張圖像
    func updateSingleImageSize(image: UIImage){
        var size = image.size
        
        let maxWidth: CGFloat = 300
        let minWidth: CGFloat = 40
        
        // 過寬圖像處理
        if size.width > maxWidth {
            //設置最大寬度
            size.width  = 200
            //等比例調整高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        //過窄的圖像處理
        if size.width < minWidth {
            size.width = minWidth
            
            //要特殊處理高度，否則太大，會影響用戶休驗
            size.height = size.width * image.size.height / image.size.width / 4
        }
        
        
        //过高图片处理, 图片填充模式就是scaleToFill, 高度减小会自动裁切
        if size.height > 200 {
            size.height = 200
        }
        
        
        
        //注意：
        size.height += WBStatusPictureViewOutterMargin
        
        
        //重新設置配圖視圖大小
        pictureViewSize = size
        
        //更新行高
        updateRowHeight()
    }
    
    
    
    /// 計算指定數量的圖片對應的配圖視圖的大小
    ///
    /// - Parameter count: 配圖數量
    /// - Returns: 配圖視圖的大小
    private func calcPictureViewSize(count: Int?) -> CGSize {
        
        if count == 0 || count == nil{
            return CGSize()
        }
        
    
        //計算高度
        //根據 count 知道 行數 1~9
        let row = (count! - 1) / 3 + 1
        //根據行數算高度
        var height = WBStatusPictureViewOutterMargin
        height += CGFloat(row) * WBStatusPictureItemWidth
        height += CGFloat(row - 1) * WBStatusPictureViewInnerMargin
        
        return CGSize(width: WBStatusPictureViewWidth, height: height)
    }
    
    
    /// 给定一个数字，返回对应的描述结果
    ///
    /// - Parameters:
    ///   - count: 数字
    ///   - defaultStr: 默认字符串， 转发/评论/赞
    /// - Returns: 描述
    private func countString(count: Int, defaultStr: String) -> String {
        if count == 0 {
            return defaultStr
        }
        
        if count < 10000 {
            return count.description
        }
        
        return String(format: "%.02f 万", Double(count) / 10000)
    }
    
    
}
